css: Implement font-variant-caps
authorMatthias Clasen <mclasen@redhat.com>
Mon, 18 Sep 2017 04:12:12 +0000 (00:12 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 18 Sep 2017 18:26:57 +0000 (14:26 -0400)
This gets translated to the corresponding OpenType features.

gtk/gtkcssstyle.c
gtk/gtkcssstylepropertyimpl.c
gtk/gtkcsstypesprivate.h

index a0bdc8d536900cc39329a4068885fb1896b50ae6..8b35f0e5ceac2a74ab4404b1dd3f30ed51c2063e 100644 (file)
@@ -228,6 +228,7 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style)
   GtkCssValue *kerning;
   GtkCssValue *ligatures;
   GtkCssValue *position;
+  GtkCssValue *caps;
   GString *s;
   int i;
 
@@ -312,6 +313,38 @@ gtk_css_style_get_pango_attributes (GtkCssStyle *style)
       g_string_append (s, "sups 1");
     }
 
+  caps = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_FONT_VARIANT_CAPS);
+  if (strcmp (_gtk_css_ident_value_get (caps), "small-caps") == 0)
+    {
+      if (s->len > 0) g_string_append (s, ", ");
+      g_string_append (s, "smcp 1");
+    }
+  else if (strcmp (_gtk_css_ident_value_get (caps), "all-small-caps") == 0)
+    {
+      if (s->len > 0) g_string_append (s, ", ");
+      g_string_append (s, "c2sc 1, smcp 1");
+    }
+  else if (strcmp (_gtk_css_ident_value_get (caps), "petite-caps") == 0)
+    {
+      if (s->len > 0) g_string_append (s, ", ");
+      g_string_append (s, "pcap 1");
+    }
+  else if (strcmp (_gtk_css_ident_value_get (caps), "all-petite-caps") == 0)
+    {
+      if (s->len > 0) g_string_append (s, ", ");
+      g_string_append (s, "c2pc 1, pcap 1");
+    }
+  else if (strcmp (_gtk_css_ident_value_get (caps), "unicase") == 0)
+    {
+      if (s->len > 0) g_string_append (s, ", ");
+      g_string_append (s, "unic 1");
+    }
+  else if (strcmp (_gtk_css_ident_value_get (caps), "titling-caps") == 0)
+    {
+      if (s->len > 0) g_string_append (s, ", ");
+      g_string_append (s, "titl 1");
+    }
+
   attrs = add_pango_attr (attrs, pango_attr_font_features_new (s->str));
   g_string_free (s, TRUE);
 
index 3514dc28f7b469df11ccc8245f67eec38112d145..12b4f3ce158affbcd21b17cd4fe88edcf89ecfbc 100644 (file)
@@ -641,6 +641,22 @@ parse_font_variant_position (GtkCssStyleProperty *property,
   return value;
 }
 
+static GtkCssValue *
+parse_font_variant_caps (GtkCssStyleProperty *property,
+                         GtkCssParser        *parser)
+{
+  GtkCssValue *value = NULL;
+
+  value = _gtk_css_ident_value_try (parser, "normal",
+                                            "small-caps", "all-small-caps",
+                                            "petite-caps", "all-petite-caps",
+                                            "unicase", "titling-caps", NULL);
+  if (value == NULL)
+    _gtk_css_parser_error (parser, "unknown value for property");
+
+  return value;
+}
+
 static GtkCssValue *
 box_shadow_value_parse (GtkCssStyleProperty *property,
                         GtkCssParser        *parser)
@@ -1150,6 +1166,14 @@ _gtk_css_style_property_init_properties (void)
                                           parse_font_variant_position,
                                           NULL,
                                           _gtk_css_ident_value_new ("normal"));
+  gtk_css_style_property_register        ("font-variant-caps",
+                                          GTK_CSS_PROPERTY_FONT_VARIANT_CAPS,
+                                          G_TYPE_NONE,
+                                          0,
+                                          GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS,
+                                          parse_font_variant_caps,
+                                          NULL,
+                                          _gtk_css_ident_value_new ("normal"));
   gtk_css_style_property_register        ("text-shadow",
                                           GTK_CSS_PROPERTY_TEXT_SHADOW,
                                           G_TYPE_NONE,
index cb340ea05e84e56846471f14fc6b838152687ddb..3adb14ca00f958ff64d65ec8401df2fe282fcccb 100644 (file)
@@ -166,6 +166,7 @@ enum { /*< skip >*/
   GTK_CSS_PROPERTY_FONT_KERNING,
   GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES,
   GTK_CSS_PROPERTY_FONT_VARIANT_POSITION,
+  GTK_CSS_PROPERTY_FONT_VARIANT_CAPS,
   GTK_CSS_PROPERTY_TEXT_SHADOW,
   GTK_CSS_PROPERTY_BOX_SHADOW,
   GTK_CSS_PROPERTY_MARGIN_TOP,